#include "project/initialization.h"

void
setActiveModel(short int op)
{
	active_model = op;
	switch(active_model)
	{
		case 1:
			active_ply = ply1;
			break;
			
		case 2:
			active_ply = ply2;
			break;
			
		default:
			break;			
	}
}

void
displayInit(void)
{
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);

//	setActiveModel(1);
}

void
displayEye(void)
{
	gluLookAt(2.0f, 2.0f, eyeZ, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
}

void
displayReshape(GLsizei width, GLsizei height)
{
	glViewport(0, 0, width, height);               
}

void
displayProjection()
{
	/* Configura projecao da camera */
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	
	switch (projection)
	{
		case 0: /* PERSPECTIVA */
			gluPerspective(
				45.0, // Campo de visao no eixo Y
				1.0, // Proporcao largura / altura (a proporcao do ambiente corresponde a proporcao do objeto selecionado na cena)
				0.01, // zNear
				10.0 // zFar
			);
			break;		
		case 1: /* FRUSTUM (nao ha correcao sobre a proporcao original do objeto) */
			glFrustum(
				-(active_ply->b_sphere->radius), active_ply->b_sphere->radius, // Limites verticais: definidos pelo raio da esfera circunscrita ao modelo selecionado 
				-(active_ply->b_sphere->radius), active_ply->b_sphere->radius, // Limites horizontais: definidos pelo raio da esfera circunscrita ao modelo selecionado
				active_ply->ideal_eyeZ - active_ply->b_sphere->radius, active_ply->ideal_eyeZ + active_ply->b_sphere->radius
			);
			break;
		case 2: /* ORTOGONAL (nao ha correcao sobre a proporcao original do objeto) */
			glOrtho(
				-active_ply->b_sphere->radius, active_ply->b_sphere->radius, // Limites verticais: definidos pelo raio da esfera circunscrita ao modelo selecionado
				-active_ply->b_sphere->radius, active_ply->b_sphere->radius, // Limites horizontais: definidos pelo raio da esfera circunscrita ao modelo selecionado
				0.01f, // zNear
				active_ply->ideal_eyeZ + (active_ply->b_sphere->radius) // zFar
			);
			break;
	}

	/* Muda a matriz modelview atual  */
	glMatrixMode(GL_MODELVIEW);  
}

void
displayWindow(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	displayEye();
	displayProjection(); 

	glScalef(0.5f, 0.5f, 0.5f);

	/* Desenha os tres eixos cartesianos */
	drawWorldAxis();

	/* Desenha modelo PLY ativo */
//	drawPlyModel(active_ply);

	/* Desenha cenario (cubo quadriculado) */
	drawScenario(2.0f, 5);

//	glutWireCube(cube_size*10);
//	glutSolidCube(cube_size);
//	printf("%f",cube_size);

	/* glutSwapBuffers implica implicitamente em uma chamada a funcao glFlush() */
	glutSwapBuffers();

	errCheck();
}






